home *** CD-ROM | disk | FTP | other *** search
/ 130 MIDI Tool Box / 130 MIDI Tool Box.iso / sda_ur22 / sda_usr1.asm < prev    next >
Assembly Source File  |  1987-08-05  |  12KB  |  633 lines

  1. page
  2. name    SDA_USER_ROUTINES
  3.  
  4. code    segment public 'code'
  5.     assume cs:code,ds:code
  6.  
  7.  
  8. ;******************************************************************
  9. ;*    
  10. ;*             RELEASE 2.0
  11. ;*    
  12. ;*  CHANGES TO PRE-EXISTING (RELEASE 1.0) ROUTINES:
  13. ;*
  14. ;*  1.    _CHECK4_SDA now alters reg. CX.
  15. ;*
  16. ;*    This routine has been modified to turn off the tempo updates
  17. ;*    that are active if the TSR program is invoked out of Promidi's
  18. ;*    Play/Record screen.
  19. ;*
  20. ;*  2.    _PREP_RTN must be called before the TSR program terminates
  21. ;*      and returns.  This will re-activate the tempo updates if 
  22. ;*      necessary.
  23. ;*
  24. ;*  These changes affect only the routines in this source module.
  25. ;*  Release 1.0 User Routines will continue to work (unmodified)
  26. ;*  with ALL Promidi software (ver. C11 & above).
  27. ;*
  28. ;*
  29. ;*
  30. ;*            NEW FEATURES
  31. ;*
  32. ;*  Routines have been added that allow TSR programs to put the
  33. ;*  Midicard in UART Mode and access the interface directly
  34. ;*  through its I/O space.
  35. ;*
  36. ;*  The UART Mode send and receive routines (_U_SNDB, _U_RCVB) are
  37. ;*  many times faster than _SDA_GETB and _SDA_PUTB.  They are 
  38. ;*  intended to be used for "longer" uploads and downloads (say more
  39. ;*  than 100 bytes or so) where the ability to send and receive
  40. ;*  while Promidi is playing or recording are not as important
  41. ;*  as the time required for the operations.
  42. ;*
  43. ;*  In UART Mode, there is no Midi Thru capability in the
  44. ;*  Midicard.  Any passing of data through the interface 
  45. ;*  (Midi In to Midi Out) must be done by the TSR software in this mode.
  46. ;*
  47. ;*  UART Mode may be entered and exited on a message by message
  48. ;*  basis, using _SDA_GETB and _SDA_PUTB for the shorter messages;
  49. ;*  and _U_RCVB and _U_SNDB for longer ones.  
  50. ;*
  51. ;*  *** DANGER ***
  52. ;*
  53. ;*     Only the following User Routines may be called while
  54. ;*     in UART Mode:
  55. ;*
  56. ;*        _U_RCVB        Get a byte from the Midicard
  57. ;*
  58. ;*        _U_SNDB        Send a byte to the Midicard
  59. ;*
  60. ;*        _SDA_UOFF    Leave UART Mode
  61. ;*
  62. ;*        _SDA_EXEC    Call Promidi's EXEC
  63. ;*
  64. ;*  To enter UART Mode, the TSR software must first call '_SDA_UON'.
  65. ;*  This routine returns 0 (FAIL) if Promidi is recording or playing,
  66. ;*  or the TSR software is recording ('_SDA_RECON').  In the case
  67. ;*  of Promidi recording or playing, it is suggested that the 
  68. ;*  software notify the user that the type of operation requested
  69. ;*  can not be performed while playing or recording.  The user may
  70. ;*  then flip back to Promidi to stop, and then return to the TSR
  71. ;*  program.
  72. ;*
  73. ;******************************************************************
  74.  
  75.  
  76. ;******************************************************************
  77. ;*
  78. ;* See companion file 'SDA_USER.DOC' for more information on 
  79. ;* these subroutines.
  80. ;*
  81. ;******************************************************************
  82.  
  83.  
  84.  
  85.  
  86. ;******************************************************************
  87. ;*
  88. ;* This software is intended to provide access to a running
  89. ;* Promidi system from co-resident software which receives
  90. ;* control via INT 16 (function 1).  Two prerequisites are
  91. ;* necessary before the service routines may be called:
  92. ;*  1. The interrupting routine must immediately save the Promid's
  93. ;*     DS register in _SDA_DSEG.
  94. ;*  2. The routine _CHECK4_SDA must be called successfully
  95. ;*     (RET = 1).  This routine binds the two programs together.
  96. ;*
  97. ;* If it is desired to have Promidi continue to read from the disk
  98. ;* (as when playing a file/track), the routine _SDA_EXEC must be
  99. ;* called periodically.
  100. ;*
  101. ;******************************************************************
  102.  
  103.  
  104. ;*************************************************************************
  105. ;*
  106. ;* The source file 'SDA_USER.ASM' is provided free of charge by Systems 
  107. ;* Design Associates, Inc.  SDA does not in any way warranty this software 
  108. ;* nor is it liable for any damages resulting from its use.
  109. ;*
  110. ;*************************************************************************
  111.  
  112.  
  113.  
  114.  
  115.  
  116. PUBLIC    _SDA_DSEG
  117.  
  118.  
  119. _SDA_DSEG    DW    0    ; SDA's Data Segment
  120.                 ; Must be saved by the user upon
  121.                 ;  entrance via INT 16.
  122.  
  123. SDA_SS        DW    0    ; SAVED IN SDAKI BEFORE THE INT 16.
  124. SDA_SP        DW    0
  125. SDA_BP        DW    0
  126. SDA_SI        DW    0
  127. SDA_DI        DW    0
  128.  
  129. USER_SS        DW    0    ; SAVED IN THE USER ROUTINES
  130. USER_DS        DW    0    ;  THAT CALL EXEC.
  131. USER_SP        DW    0
  132. USER_BP        DW    0
  133. USER_DI        DW    0
  134. USER_ES        DW    0
  135.  
  136. IRLOC2        dw    (8 + 2) * 4    ; Midicard Interrupt locations.
  137. IRLOC7        dw    (8 + 7) * 4
  138. IRLOC5        dw    (8 + 5) * 4
  139. IRLOC4        dw    (8 + 4) * 4
  140.  
  141. PTA        dw    ?        ; Midicard Port Addresses
  142. PTB        dw    ?
  143. PTC        dw    ?
  144. PTCNTL        dw    ?
  145.  
  146. UREC_MODE    db    0        ; In User Record Mode Flag
  147. TUP_STATUS    db    0        ; Tempo Update Status Flag.
  148.  
  149.  
  150. PUBLIC    _CHECK4_SDA,_SDA_GETB,_SDA_PUTB,_SDA_EXEC,_SDA_RECON
  151. PUBLIC    _SDA_RECOFF,_U_SNDB,_U_RCVB,_PREP_RET,_SDA_UON,_SDA_UOFF
  152. page
  153.  
  154.  
  155.  
  156. ; _CHECK4_SDA
  157. ;
  158. ; *** DANGER *** THIS ROUTINE MUST BE CALLED SUCCESSFULLY (RET = 1)
  159. ;         IN ORDER TO USE ANY OF THE SDA USER FUNCTIONS.
  160. ;
  161. ; If SDA interface (Midicard) interrupt handler is
  162. ;  in place, this routine fills SDA_SEG & SDA_OFST with the
  163. ;  addr. of USER_CALL.
  164. ;
  165. ;    Returns:    ax = 0        Handler not present.
  166. ;            ax = 1        Is present - data filled.
  167. ;
  168. ;    Regs altered - ax,bx,cx,dx
  169.  
  170. _CHECK4_SDA proc far
  171.     push    es
  172.     push    si
  173.     push    bp
  174.  
  175.     mov    si,[IRLOC2]
  176.     call    SDA_MATCH
  177.     cmp    ax,1
  178.     je    GOT_MATCH
  179.  
  180.     mov    si,[IRLOC7]
  181.     call    SDA_MATCH
  182.     cmp    ax,1
  183.     je    GOT_MATCH
  184.  
  185.     mov    si,[IRLOC5]
  186.     call    SDA_MATCH
  187.     cmp    ax,1
  188.     je    GOT_MATCH
  189.  
  190.     mov    si,[IRLOC4]
  191.     call    SDA_MATCH
  192.     cmp    ax,1
  193.     je    GOT_MATCH
  194.  
  195.     xor    ax,ax         ; No match - don't use card.
  196.     jmp    CHKRET
  197.  
  198. GOT_MATCH:
  199.  
  200. ; si = int. vector offset.
  201.  
  202.     xor    ax,ax
  203.     mov    es,ax
  204.  
  205.     mov    ax,es:[si + 2]        ; Get segment of int. rout.
  206.     mov    bx,es:[si]        ; Get offset   "    "
  207.     sub    bx,8            ;  minus 8.
  208.     mov    es,ax
  209.     mov    ax,es:[bx + 2]    ; Get USER_CALL segment
  210.     mov    dx,es:[bx]    ; Get offset.
  211.  
  212.     mov    cs:[SDA_SEG],ax
  213.     mov    cs:[SDA_OFST],dx
  214.  
  215.     mov    si,11            ; Get tempo update status.
  216.     call    DOUC
  217.     mov    TUP_STATUS,al
  218.  
  219.     cmp    al,0            ; Are tempo status updates active ?
  220.     jz    UPNA            ; No
  221.  
  222.     mov    si,8            ; Yes - Turn them off.
  223.     call    DOUC
  224. UPNA:
  225.     mov    si,6            ; Get port addresses of Midicard
  226.     call    DOUC
  227.  
  228.     mov    PTA,ax
  229.     inc    ax
  230.     mov    PTB,ax
  231.     inc    ax
  232.     mov    PTC,ax
  233.     inc    ax
  234.     mov    PTCNTL,ax
  235.  
  236.     mov    ax,1
  237. CHKRET:
  238.     pop    bp
  239.     pop    si
  240.     pop    es
  241.     ret
  242. _CHECK4_SDA endp
  243.  
  244.  
  245.  
  246. ; SDA_MATCH
  247. ;
  248. ; This routine looks for the string "SDA " above the interrupt
  249. ; location indicated by the vector offset in 'si'.
  250. ;
  251. ;    Returns:    ax = 0        No match
  252. ;            ax = 1        Match
  253. ;
  254. ;    Regs altered    ax,bx,es
  255.  
  256. SDA_MATCH proc near
  257.     xor    ax,ax
  258.     mov    es,ax
  259.     mov    bx,si
  260.     mov    ax, word ptr es:[bx] + 2
  261.     mov    bx, word ptr es:[bx]
  262.     mov    es,ax
  263.  
  264.     cmp    byte ptr es:[bx] - 4,'S'
  265.     jne    matret
  266.  
  267.     cmp    byte ptr es:[bx] - 3,'D'
  268.     jne    matret
  269.  
  270.     cmp    byte ptr es:[bx] - 2,'A'
  271.     jne    matret
  272.  
  273.     cmp    byte ptr es:[bx] - 1,' '
  274.     jne    matret
  275.     mov    ax,1
  276. matret:    
  277.     ret
  278. SDA_MATCH endp
  279. page
  280.  
  281.  
  282.  
  283. ; _PREP_RET  -  Prepare to terminate program and return to Promidi.
  284. ;
  285. ;  *******    THIS ROUTINE MUST BE CALLED BEFORE TSR PROGRAM TERMINATION
  286. ;        
  287. ;
  288. ;  c  call    prep_ret();
  289. ;
  290. ;  asm  call    call    _prep_ret
  291. ;    (far)
  292. ;
  293. ;    Regs Altered: ax,bx,cx,dx
  294.  
  295. _PREP_RET    proc    far
  296.  
  297.     cmp    TUP_STATUS,0    ; Was tempo status update active ?
  298.     jz    RETRET        ; No
  299.  
  300.     push    si
  301.     mov    si,7        ; Yes - re-enable tempo updates.
  302.     call    DOUC
  303.     pop    si
  304. RETRET:
  305.     ret
  306. _PREP_RET    endp
  307. page
  308.  
  309.  
  310.  
  311.  
  312. ; _SDA_GETB  -  If in sda record mode, get a byte from midi in.
  313. ;
  314. ;  c  call    c = sda_getb();
  315. ;
  316. ;  asm  call    call    _sda_getb    ; Byte or ret. code in ax.  
  317. ;    (far)
  318. ;
  319. ;    RETURNS:    byte
  320. ;            100H        Buffer empty
  321. ;            2nnH        Buffer overflow (byte in LSB).
  322. ;
  323. ;    Regs Altered: ax,bx,cx,dx
  324.  
  325. _SDA_GETB    proc    far
  326.  
  327.     push    si
  328.     mov    si,1
  329.     call    DOUC
  330.     pop    si
  331.     ret
  332. _SDA_GETB    endp
  333. page
  334.  
  335.  
  336.  
  337.  
  338. ; _SDA_PUTB  -  send a byte (of a complete midi msg.) out midi out.
  339. ;
  340. ;  c call    sda_putb(c);
  341. ;
  342. ;  asm call    push    ax        ; Push byte on stack
  343. ;   (far)    call    _sda_putb
  344. ;        add    sp,2
  345. ;
  346. ;    Regs Altered: ax,bx,cx,dx
  347.  
  348.  
  349. _SDA_PUTB    proc    far
  350.  
  351.     push    bp
  352.     mov    bp,sp
  353.     push    si
  354.     mov    cx,[bp+6]    ; Get parameter.
  355.     mov    si,2
  356.     call    DOUC
  357.     pop    si
  358.     pop    bp
  359.     ret
  360. _SDA_PUTB    endp
  361. page
  362.  
  363.  
  364.  
  365. ; _SDA_RECON  -  Go into SDA record mode.
  366. ;
  367. ;  c  call    sda_recon();
  368. ;
  369. ;  asm  call    call    _sda_recon
  370. ;    (far)
  371. ;
  372. ;    Returns:    non-0    No. of bytes allocated to receive buffer.
  373. ;            0    Fail - already recording or 
  374. ;                not enough memory.
  375. ;
  376. ;    Regs Altered: ax,bx,cx,dx
  377.  
  378.  
  379. _SDA_RECON    proc    far
  380.  
  381.     mov    UREC_MODE,1
  382.     push    si
  383.     mov    si,3
  384.     call    DOUC
  385.     pop    si
  386.     ret
  387. _SDA_RECON    endp
  388. page
  389.  
  390.  
  391.  
  392. ; _SDA_RECOFF  -  Leave SDA record mode.
  393. ;
  394. ;  c  call    sda_recoff();
  395. ;
  396. ;  asm  call    call    _sda_recoff
  397. ;    (far)
  398. ;
  399. ;    Regs Altered: ax,bx,cx,dx
  400.  
  401.  
  402. _SDA_RECOFF    proc    far
  403.  
  404.     mov    UREC_MODE,0
  405.     push    si
  406.     mov    si,4
  407.     call    DOUC
  408.     pop    si
  409.     ret
  410. _SDA_RECOFF    endp
  411. page
  412.  
  413.  
  414.  
  415.  
  416.  
  417. ; _U_SNDB  -  Send a byte to the Midicard.
  418. ;
  419. ;  c call    u_sndb(c);
  420. ;
  421. ;  asm call    push    ax        ; Push byte on stack
  422. ;   (far)    call    _u_sndb
  423. ;        add    sp,2
  424. ;
  425. ;
  426. ;    Regs Altered: ax,cx,dx
  427.  
  428. _U_SNDB    proc    far
  429.     push    bp
  430.     mov    bp,sp
  431.     mov    cx,[bp+6]        ; Get parameter.
  432. USND1:
  433.     mov    dx,PTC
  434.     in    al,dx
  435.     test    al,80H            ; Output buffer empty ?
  436.     jz    USND1            ; No - keep trying.
  437.  
  438.     mov    dx,PTB
  439.     in    al,dx
  440.     test    al,40H            ; Can we send Midi data ?
  441.     jnz    USND1            ; No - keep trying.
  442.  
  443.     mov    dx,PTCNTL        ; Say its Midi data
  444.     mov    al,4            ;   (not a command)
  445.     out    dx,al
  446.  
  447.     mov    dx,PTA            ; Send byte.
  448.     mov    al,cl
  449.     out    dx,al
  450.  
  451.     pop    bp
  452.     ret
  453. _U_SNDB    endp
  454. page
  455.  
  456.  
  457.  
  458.  
  459. ; _U_RCVB  -  If a byte is present, receive a byte from the Midicard
  460. ;
  461. ;  c  call    c = u_rcvb();
  462. ;
  463. ;  asm  call    call    _u_rcvb    ; Byte or ret. code in ax.  
  464. ;    (far)
  465. ;
  466. ;    RETURNS:    byte
  467. ;            100H        No input received
  468. ;
  469. ;    Regs Altered: ax,dx
  470.  
  471. _U_RCVB    proc    far
  472.     mov    dx,PTC
  473.     in    al,dx
  474.     test    al,20H            ; Look for input
  475.     jnz    IBFULL
  476.     mov    ax,100H            ; None
  477.     jmp    URCRET
  478. IBFULL:
  479.     mov    dx,PTA            ; Get byte
  480.     in    al,dx
  481.     xor    ah,ah
  482. URCRET:
  483.     ret
  484. _U_RCVB    endp
  485. page
  486.  
  487.  
  488.  
  489.  
  490. ; _U_TRCV  -  Test if a byte is present from the Midicard
  491. ;
  492. ;  c  call    rc = u_trcv();
  493. ;
  494. ;  asm  call    call    _u_trcv  ; Ret. code in ax.  
  495. ;    (far)
  496. ;
  497. ;    RETURNS:    0        No input.
  498. ;            1        Input present.
  499. ;
  500. ;    Regs Altered: ax,dx
  501.  
  502. _U_TRCV    proc    far
  503.     mov    dx,PTC
  504.     in    al,dx
  505.     test    al,20H            ; Look for input
  506.     jnz    UTR1
  507.     xor    ax,ax
  508.     jmp    UTRRET
  509. UTR1:
  510.     mov    ax,1
  511. UTRRET:
  512.     ret
  513. _U_TRCV    endp
  514. page
  515.  
  516.  
  517.  
  518.  
  519. ; _SDA_UON  -  Enter Uart Mode
  520. ;
  521. ;  c  call    rc = sda_uon();
  522. ;
  523. ;  asm  call    call    _sda_uoff    ; Return code in ax
  524. ;    (far)
  525. ;
  526. ;    RETURNS:  0  -  FAIL, Promidi is recording or playing, or
  527. ;              we are in User Record Mode.
  528. ;          1  -  SUCCESS  -  in Uart Mode.
  529. ;
  530. ;
  531. ;    Regs Altered: ax,bx,cx,dx
  532.  
  533. _SDA_UON    proc    far
  534.  
  535.     cmp    UREC_MODE,0
  536.     jnz    UONFAIL
  537.  
  538.     push    si
  539.     mov    si,9
  540.     call    DOUC
  541.     pop    si
  542.  
  543.     cmp    ax,0
  544.     jnz    UON2
  545. UONFAIL:
  546.     xor    ax,ax
  547.     jmp    UONRET
  548. UON2:
  549.     mov    dx,PTC
  550.     in    al,dx
  551.     test    al,80H
  552.     jz    UON2
  553.  
  554.     mov    dx,PTCNTL
  555.     mov    al,5
  556.     out    dx,al
  557.  
  558.     mov    dx,PTA
  559.     mov    al,35
  560.     out    dx,al
  561.     mov    ax,1
  562. UONRET:
  563.     ret
  564. _SDA_UON    endp
  565. page
  566.  
  567.  
  568.  
  569.  
  570. ; _SDA_UOFF  -  Leave Uart Mode
  571. ;
  572. ;  c  call    sda_uoff();
  573. ;
  574. ;  asm  call    call    _sda_uoff
  575. ;    (far)
  576. ;
  577. ;    Regs Altered: ax,bx,cx,dx
  578.  
  579. _SDA_UOFF    proc    far
  580.  
  581.     push    si
  582.     mov    si,10
  583.     call    DOUC
  584.     pop    si
  585.     ret
  586. _SDA_UOFF    endp
  587. page
  588.  
  589.  
  590.  
  591.  
  592. ; _SDA_EXEC  -  Call Promidi's multi-tasking exec.
  593. ;        This gives Promidi a chance to replenish
  594. ;        its disk buffers when playing.
  595. ;
  596. ;  c  call    sda_exec();
  597. ;
  598. ;  asm  call    call    _sda_exec
  599. ;    (far)
  600. ;
  601. ;    Regs Altered: ax,bx,cx,dx
  602.  
  603.  
  604. _SDA_EXEC    proc    far
  605.  
  606.     push    si
  607.     mov    si,5
  608.     call    DOUC
  609.     pop    si
  610.     ret
  611. _SDA_EXEC    endp
  612. page
  613.  
  614.  
  615.  
  616.  
  617. ; The DOUC sub-routine vectors into the Promidi software.
  618. ; The 2-word address must have been set up via a successful
  619. ;  call to _check4_sda.
  620.  
  621. DOUC        proc    near
  622.  
  623.         mov    ax,[_SDA_DSEG]    ; Get the SDA data seg.
  624.         db    9AH
  625. SDA_OFST    dw    0    ; USER_CALL offset.
  626. SDA_SEG        dw    0    ; USER_CALL segment.
  627.         ret
  628. DOUC        endp
  629.  
  630.     code    ends
  631.  
  632.     END
  633.